#ifndef HASHSTRING_H
#define HASHSTRING_H

#include "warlocklib_global.h"

WARLOCK_NS_BEGIN

using hash_t = unsigned long long;

constexpr hash_t prime = 0x100000001B3ull;
constexpr hash_t basis = 0xCBF29CE484222325ull;

/**
 * @brief 转换字符串为 hash_t 正整数，即可将字符串用于switch
 * @param str 输入的字符串
 * @return unsigned long long 类型的哈希值
 */
hash_t hash_switch(char const* str)
{
  hash_t ret{basis};

  while (*str) {
    ret ^= hash_t(*str);
    ret *= prime;
    str++;
  }

  return ret;
}

/*
hash_t hash_switch_string(const QString &s)
{
  return hash_switch(s.toStdString().c_str());
}
*/

/**
 * @brief 一个递归函数，在编译期直接计算字符串字面量哈希值
 * 可用于 switch 的 case
 * @see hash_switch
 * @param str
 * @param last_value
 * @return 哈希常量
 */
constexpr hash_t hash_const(char const* str, hash_t last_value = basis)
{
  return *str ?
         hash_const(str + 1, (hash_t(*str) ^ last_value) * prime) :
         last_value;
}
/*
QString fill_blanks(QString originalString, QMap<QString, QString> pairs)
{
  auto o = originalString;
  for (auto const &key : pairs.keys()) {
    auto realKey = QString("{%1}").arg(key);
    o = o.replace(realKey, pairs[key]);
  }
  return o;
}
*/

WARLOCK_NS_END

#endif // HASHSTRING_H
